package com.tiny.tinyweb.core.log;

import java.io.Serializable;

import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;

/**
 * 封装日志信息的类，重写了{@link Object#toString()}方法来格式化日志信息的各字段。
 *
 * @author wxiaobin
 */
public class LogInfo implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 默认构造器。
     */
    public LogInfo() {
    }

    // <editor-fold defaultstate="collapsed" desc="fields">
    /**
     * 当前会话的ID。
     */
    private String sessionID;

    /**
     * 操作者ID。
     */
    private String operatorID;

    /**
     * 操作者的IP地址。
     */
    private String operatorIP;

    /**
     * 处理名称，通常是被执行的方法名。
     */
    private String operation;

    /**
     * 日志消息。
     */
    private String message;

    // </editor-fold>

    // <editor-fold defaultstate="collapsed" desc="getters/setters">
    /**
     * 获得当前会话的ID。
     *
     * @return 当前会话的ID
     */
    public String getSessionID() {
        return this.sessionID;
    }

    /**
     * 设置当前会话的ID的新值。
     *
     * @param sessionID 当前会话的ID的新值
     */
    public void setSessionID(String sessionID) {
        this.sessionID = sessionID;
    }

    /**
     * 获得操作者ID。
     *
     * @return 操作者ID
     */
    public String getOperatorID() {
        return this.operatorID;
    }

    /**
     * 设置操作者ID的新值。
     *
     * @param operatorID 操作者ID的新值
     */
    public void setOperatorID(String operatorID) {
        this.operatorID = operatorID;
    }

    /**
     * 获得操作者的IP地址。
     *
     * @return 操作者的IP地址
     */
    public String getOperatorIP() {
        return this.operatorIP;
    }

    /**
     * 设置操作者的IP地址的新值。
     *
     * @param operatorIP 操作者的IP地址的新值
     */
    public void setOperatorIP(String operatorIP) {
        this.operatorIP = operatorIP;
    }

    /**
     * 获得处理名称。
     *
     * @return 处理名称
     */
    public String getOperation() {
        return this.operation;
    }

    /**
     * 设置处理名称的新值。
     *
     * @param operation 处理名称的新值
     */
    public void setOperation(String operation) {
        this.operation = operation;
    }

    /**
     * 获得日志消息。
     *
     * @return 日志消息
     */
    public String getMessage() {
        return this.message;
    }

    /**
     * 设置日志消息的新值。
     *
     * @param message 日志消息的新值
     */
    public void setMessage(String message) {
        this.message = message;
    }

    /**
     * 设置带格式字符串的日志消息。
     *
     * @param message 带格式字符串的日志消息
     * @param args 要设置格式的对象
     */
    public void setMessage(String message, Object... args) {
        this.setMessage(String.format(message, args));
    }

    // </editor-fold>

    /**
     * 重写的{@link java.lang.Object#toString()}方法，格式化日志信息。</BR>
     * 日志格式：'session,operator,IP,method,end (in xMs)'。
     *
     * @return 格式化的日志信息
     */
    @Override
    public String toString() {
        ToStringBuilder tsb = new ToStringBuilder(this, ToStringStyle.SIMPLE_STYLE);
        if (this.sessionID != null && !this.sessionID.isEmpty()) {
            tsb.append(this.sessionID);
        }
        if (this.operatorID != null && !this.operatorID.isEmpty()) {
            tsb.append(this.operatorID);
        }
        if (this.operatorIP != null && !this.operatorIP.isEmpty()) {
            tsb.append(this.operatorIP);
        }
        tsb.append(this.operation);
        tsb.append(this.message);
        return tsb.toString();
    }
}
